/************************************************************
 * Project Name         [Thinking_In_Java]
 * File Name            [GoldbachConjecture.java]
 * Creation Date        [10-Jul-2014]
 * 
 * Copyright© ge.y.yang@gmail.com All Rights Reserved
 * 
 * Work hard, play harder, think big and keep fit
 ************************************************************/
package pkg_01_console_app.goldbach;

import java.io.IOException;

import pkg_01_console_app.util.ConsoleInput;

/**
 * [哥德巴赫猜想的由来]<br>
 * 1729--1764年, 歌德巴赫与欧拉保持了长达三十五年的书信往来.<br>
 * 在1742年6月7日给欧拉的信中, 歌德巴赫提出了一个命题. <br>
 * 他写道: "随便取某一个奇数, 比如, 可以把它写成三个素数之和: 77=55+17+7,<br>
 * 再任取一个奇数, 比如461, 461=449+7+5, 也是三个素数之和, 461还可以写成257+199+5, 仍然是三个素数之和. <br>
 * 这样, 我发现: 任何大于5的奇数都是三个素数之和. <br>
 * 但这怎样证明呢? 虽然做过的 每一次试验都得到了上述结果, 但是不可能把所有的奇数都拿来检验, 需要的是一般的证明, 而不是个别的检验."<br>
 * 欧拉回信说, 这个命题看来是正确的, 但是他也不能给出严格的证明. <br>
 * 同时欧拉又提出了另一个命题: 任何一个大于2的偶数都是两个素数之和, 但是这个命题他也没能给予证明. <br>
 * 现在通常把这两个命题统称为歌德巴赫猜想. <br>
 * 
 * 哥德巴赫猜想分为: <br>
 * 1.每个不小于6的偶数都是两个奇素数之和<br>
 * 2.每个不小于9的奇数都是三个奇素数之和<br>
 * <br>
 * 本实例采用的是第一种方式. <br>
 * 
 * @author 不落的太阳(Sean Yang)
 * @version 1.0
 * @since JDK 6
 * 
 */
public class GoldbachConjecture {

	/**
	 * 哥德巴赫猜想程序运行主方法<br>
	 * 该程序的主要功能是: 输入一个数, 如果不是输入正确格式的数会进行相应的提示<br>
	 * 对于正确的数会进行分解, 并打印是否满足哥德巴赫猜想, 如果满足哥德巴赫猜想会输出相应的表达式<br>
	 * 验证完毕后会提示是否继续验证, 如果用户输入N程序结束, 否则程序继续
	 * 
	 * @param args
	 *            命令行参数
	 * @throws IOException
	 * @throws NumberFormatException
	 */
	public static void main(String[] args) throws NumberFormatException,
			IOException {
		System.out.println("**********程序开始**********");
		boolean play = true; // 游戏运行的标记量, true表示运行, false表示退出
		while (play) {
			int input = ConsoleInput.inputInt("请输入一个偶数: "); // 接收输入的整数
			while (input < 6 || input % 2 != 0) {
				// 判断是否是满足条件的整数, 满足条件进行下一步, 不满足条件从新输入
				input = ConsoleInput.inputInt("请输入一个不小于6的偶数: ");
			}
			MathUtil.decomposing(input); // 进行哥德巴赫猜想的验证
			String mess = ConsoleInput.inputString("是否继续验证?输入任意字符继续/输入N退出");
			if (mess.equals("N") || mess.equals("n"))
				play = false; // 提示用户是否继续, 如果用户输入N则退出程序, 否则程序继续
		}
		System.out.println("**********程序结束**********");
	}
}
